/**
* Simplest Librtmp Send 264
 *
 * 雷霄骅，张晖
 * leixiaohua1020@126.com
 * zhanghuicuc@gmail.com
 * 中国传媒大学/数字电视技术
 * Communication University of China / Digital TV Technology
 * http://blog.csdn.net/leixiaohua1020
 *
 * 本程序用于将内存中的H.264数据推送至RTMP流媒体服务器。
 *
 */
#ifndef H264UTILS_H
#define H264UTILS_H


class H264Utils {
public:
    /**
    * 解码SPS中的信息
    *
    * @param pBuff SPS数据内容
    * @param nLen SPS数据的长度
    * @param nStartBit 当前解析到的字节位置
    *
    * @返回码
    */
    static unsigned int ue(const unsigned char *pBuff, const unsigned int nLen, unsigned int &nStartBit);


    /**
    * 解码SE(Exp-Golomb)
    *
    * @param pBuff SE数据内容
    * @param nLen SE数据的长度
    * @param nStartBit 当前解析到的字节位置
    *
    * @返回码
    */
    static int se(const unsigned char *pBuff, const unsigned int nLen, unsigned int &nStartBit);


    /**
     * 解码u(BitCount)
     * @param BitCount 位数
     * @param buf 输入数据
     * @param nStartBit 当前解析到的字节位置
     * @return
     */
    static unsigned long u(const unsigned int BitCount, const unsigned char *buf, unsigned int &nStartBit);

    /**
     * H264的NAL起始码防竞争机制
     *
     * @param buf SPS数据内容
     * @param buf_size SPS数据长度
     *
     * @无返回值
     */
    static void deEmulationPrevention(unsigned char *buf, unsigned int *buf_size);

    /**
     * 解码SPS,获取视频图像宽、高信息
     *
     * @param buf SPS数据内容
     * @param nLen SPS数据的长度
     * @param width 图像宽度
     * @param height 图像高度
     * @param fps 帧率

     * @成功则返回1 , 失败则返回0
     */
    static int h264DecodeSps(unsigned char *buf, unsigned int nLen, int &width, int &height, int &fps);
};


#endif //H264UTILS_H
